﻿/***********************************************************************************************
 * 	备注提示信息显示类  （该类为指定的 DisplayObject 对象设置提示信息）
 * 
 * 	调用方式 MemoObject.create(spr, msg, arrow, isBrush, isMouse)
 * 
 * 		spr			被指定的 DisplayObject 对象
 * 		msg			要显示出来的提示信息内容
 * 		arrow		提示信息显示的位置 MemoObject.UP_ARROW 和 MemoObject.DOWN_ARROW 两个值
 * 		isBursh		是否一直刷新 （主要针对对象移动时可刷新备注的显示） （该功能有待扩展）
 * 		isMouse		是否跟随鼠标显示  （主要针对部份特殊的提示信息） 默认值为 false （该功能有待扩展）
 ***********************************************************************************************/

package org.dstart.object.memo
{
	import flash.display.DisplayObject;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.events.TimerEvent;
	import flash.geom.Point;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import flash.utils.Timer;
	
	import org.dstart.csuper.SuperSprite;
	import flash.display.Sprite;

	public class MemoObject extends SuperSprite
	{
		public static const UP_ARROW:Number		= 1;	/** 上方显示  **/
		public static const DOWN_ARROW:Number 	= 0;	/** 下方显示	**/
		
		public static var WaitSpeed:Number	= 0.1;	/**	等待时间 （以秒为单位） **/
		public static var ShowPlace:Number	= 5;	/** 备注文本显示时间 （以秒为单位）**/
				
		private var msgText:TextField;		/** 用于显示信息的文字框 **/
		private var msgSprite:Sprite;		/** 文字显示区下部份的显示对象 **/
		
		private var gTime:Timer;			/** 用于显示时的等待时间 **/	
		private var wTime:Timer;			/** 用于消失时的等待时间 **/
		
		private var msgString:String;		/** 消息文本 **/
		private var waitTime:Number;		/** 等待时间（以毫秒为单位）**/
		
		private var mcFarter:DisplayObject;	/** 调用当前对象的上一级对象 **/
		private var nowArrow:Number;		/** 要显示的位置 **/
		
		/** 创建一个新的备注对象 静态方法 **/
		public static function create(spr:DisplayObject, str:String, showArrow:Number = 0, isRushPlace:Boolean = false, isMouse:Boolean = false):MemoObject
		{
			return new MemoObject(spr, str, showArrow, isRushPlace, isMouse);
		}
		
		/** 构造函数，也可以使用该函数来创建对象 **/
		public function MemoObject(spr:DisplayObject, str:String, showArrow:Number, isRushPlace:Boolean, isMouse:Boolean)
		{
			mcFarter = spr;
			msgString = str;
			waitTime = 1000;
			nowArrow = showArrow;
						
			if(mcFarter)
			{
				InitObject();
				InitListener(isRushPlace, isMouse);
			}
		}
		
		/** 初始化各对象 **/
		private function InitObject():void
		{		
			msgText = new TextField();
			msgText.width = 4000;
			msgText.height = 20;
			msgText.text = msgString;
			msgText.width = msgText.textWidth + 10;
			msgText.height = msgText.textHeight + 4;
			msgText.selectable = false;
			
			msgSprite = new Sprite();
			msgSprite.graphics.lineStyle(0.5, 0x000000, 1);
			msgSprite.graphics.beginFill(0xFFFFCC, 1);
			msgSprite.graphics.drawRect(-2, 0, msgText.width, msgText.height);
			msgSprite.graphics.endFill();
			
			// msgText.background = true;
			// msgText.backgroundColor = 0xFFFF99;
			// msgText.border = true;
			// msgText.borderColor = 0x000000;
			// msgText.autoSize = TextFieldAutoSize.CENTER;
			
			msgText.mouseEnabled = false;
			this.mouseChildren = this.mouseEnabled = false;
			
			_root.addChild(msgSprite);
			_root.addChild(msgText);
			
			this.visible = false;
			
			gTime = new Timer(waitTime * WaitSpeed);
			wTime = new Timer(waitTime * ShowPlace);
		}
		
		/** 设置对象的事件侦听  **/
		private function InitListener(isRushPlace:Boolean, isMouse:Boolean):void
		{
			this.mcFarter.addEventListener(MouseEvent.ROLL_OVER, onRollOverEvent);
			this.mcFarter.addEventListener(MouseEvent.ROLL_OUT, onRollOutEvent);
			
			if(isRushPlace)
			{
				this.mcFarter.addEventListener(MouseEvent.MOUSE_MOVE, onChangePlace);
			}
		}
		
		/** 修改对象位置 **/
		private function onChangePlace(e:MouseEvent):void
		{
			var p:Point = mcFarter.parent.localToGlobal(new Point(mcFarter.x, mcFarter.y));
			var tx:Number = p.x + this.mcFarter.width/2 - this.msgText.width/4;
			var ty:Number = p.y;
			
			if(this.nowArrow == MemoObject.UP_ARROW)
			{
				ty = ty - this.msgText.height - MemoObject.ShowPlace;				
			}
			else
			{
				ty = ty + this.mcFarter.height + MemoObject.ShowPlace;
			}
			
			this.x = tx;
			this.y = ty;
			
			e.updateAfterEvent();
		}
		
		/** 鼠标移动到对象上面 **/
		private function onRollOverEvent(e:MouseEvent):void
		{
			onChangePlace(e);
						
			mcFarter.stage.addChild(this);
			
			Enabled(true);
		}
		
		/** 鼠标从对象上移开 **/
		private function onRollOutEvent(e:MouseEvent):void
		{
			Enabled(false);
		}		
		
		/** 开启/关闭 备注信息的显示 **/
		private function Enabled(flag:Boolean):void
		{
			if(flag)
			{
				gTime.addEventListener(TimerEvent.TIMER, onTimerEvent);
				gTime.start();
				
				if(wTime.running)
				{
					wTime.stop();
					wTime.removeEventListener(TimerEvent.TIMER, onHiddenThis);	
				}
				else
				{
					wTime.addEventListener(TimerEvent.TIMER, onHiddenThis);	
					wTime.start();
				}
			}
			else
			{
				if(wTime.running)
				{
					wTime.stop();
					wTime.removeEventListener(TimerEvent.TIMER, onHiddenThis);	
				}
				
				if(gTime.running)
				{				
					gTime.stop();
					gTime.removeEventListener(TimerEvent.TIMER, onTimerEvent);
				}

				this.visible = false;
			}
		}
		
		/** 显示完毕后显示事件 **/
		private function onTimerEvent(e:TimerEvent):void
		{
			gTime.stop();
			gTime.removeEventListener(TimerEvent.TIMER, onTimerEvent);

			wTime.start();
						
			// this.Display();
			this.visible = true;
		}
		
		/** 隐藏对象时触发事件 **/
		private function onHiddenThis(e:TimerEvent):void
		{
			wTime.stop();
			wTime.removeEventListener(TimerEvent.TIMER, onHiddenThis);	
			
			// this.Clear();
			this.visible = false;
		}
	}
}